﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace PMatch
{

	public static class BioUtil
	{
		/// <summary>
		/// Alfabeto basico para representar aminoacidos segun el codigo oficial de IUPAC
		/// </summary>
		public const string AminoacidAlphabet = "ARNDCQEGHILKMFPSTWYVXB";

		/// <summary>
		/// Indica si es un caracter basico para aminoacido reconocido por IUPAC 
		/// </summary>
		/// <param name="aminoacid"></param>
		/// <returns></returns>
		public static bool IsIUPACAminoacid(char aminoacid)
		{
			var upper = char.ToUpper(aminoacid);
			return AminoacidAlphabet.Contains(upper);
		}

		public static bool IsIUPACAminoacidString(string aminoacidString)
		{
			return aminoacidString.All(x => IsIUPACAminoacid(x));
		}

		/// <summary>
		/// Convierte a entero el aminoacido
		/// </summary>		
		public static int ToInt(char aminoacid)
		{
			var upper = char.ToUpper(aminoacid);
			return AminoacidAlphabet.IndexOf(upper);
		}

		/// <summary>
		/// Convierte una sequencia de aminoacidos en arreglo de enteros
		/// </summary>		
		public static int[] ToIntegerSequence(string c)
		{
			var aminoacidString = c.ToUpper();
			var seq = new int[aminoacidString.Length];
			for (int i = 0; i < aminoacidString.Length; i++)
			{
				seq[i] = ToInt(aminoacidString[i]);
				if (seq[i] == -1) { throw new InvalidOperationException("Simbolo no distinguido " + aminoacidString[i]); }
			}
			return seq;
		}
	}
}
